[Terraform] App Runnerを構築するときInvalidRequestException: Error in assuming access role が発生したときの対処法
どうも!オペレーション部の西村祐二です。
最近、TerraformでApp Runnerを構築する機会がありました。
そこで、ハマったことと対処法を備忘録兼ねてブログにしておきます。
環境
Terraform:v1.5.4
発生したエラー内容
TerraformでApplyを実行すると下記エラーが発生しました。ただ実装みても問題のある箇所が見当たらなかったので、再度実行すると正常に成功するという事象でした。
Error: error creating App Runner Service (xxxxxx): InvalidRequestException: Error in assuming access role arn:aws:iam::xxxxxxxx:role/xxxxxxx
ECRにアクセスしようとした際にエラーになっているようでした。
対処方法
App Runnerに設定するロール作成後に一定時間待つ処理を追加することでエラーを回避することができました。
調査すると同様の事象が別のツールではありますが、発生しているIssueがありました。回避策としてsleepを入れることで回避できるとのコメントがありTerraformでも同様にsleep処理を入れることで回避できました。
Error in assuming access role · Issue #2411 · pulumi/pulumi-aws
エラー回避例
エラーが発生しているRole作成後に10秒待つようにしています。
公式で提供されているTime Providerを利用して実現しています。
Docs overview | hashicorp/time | Terraform | Terraform Registry
# ------------------------------------------------------------------------------ # App Runner Access Role # ------------------------------------------------------------------------------ resource "aws_iam_role" "apprunner_access" { name = "${var.env}-${var.app}-apprunner-access" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": [ "build.apprunner.amazonaws.com" ] }, "Effect": "Allow", "Sid": "" } ] } EOF } resource "aws_iam_role_policy_attachment" "apprunner_service_ecr" { role = aws_iam_role.apprunner_access.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSAppRunnerServicePolicyForECRAccess" } # Apprunner作成時にInvalidRequestException: Error in assuming access role # 発生しないように10秒待つ resource "time_sleep" "wait_10_seconds" { create_duration = "10s" triggers = { apprunner_access_arn = aws_iam_role.apprunner_access.arn } } # ------------------------------------------------------------------------------ # App Runner Instance Role # ------------------------------------------------------------------------------ resource "aws_iam_role" "apprunner_instance" { name = "${var.env}-${var.app}-apprunner-instance" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "tasks.apprunner.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF }
resource "aws_apprunner_service" "main" { service_name = "${var.env}-${var.app}" depends_on = [ null_resource.push_image, ] source_configuration { authentication_configuration { access_role_arn = time_sleep.wait_10_seconds.triggers["apprunner_access_arn"] } image_repository { image_configuration { port = local.env.port runtime_environment_variables = { "SERVICE_NAME" = var.service "APP_NAME" = var.app "Env" = var.env } } image_identifier = "${aws_ecr_repository.main.repository_url}:latest" image_repository_type = "ECR" } auto_deployments_enabled = true } instance_configuration { cpu = local.env.cpu memory = local.env.memory instance_role_arn = aws_iam_role.apprunner_instance.arn } auto_scaling_configuration_arn = aws_apprunner_auto_scaling_configuration_version.main.arn } resource "aws_apprunner_auto_scaling_configuration_version" "main" { auto_scaling_configuration_name = "${var.app}-autoscaling" max_concurrency = local.env.max_concurrency max_size = local.env.max_size min_size = local.env.min_size }
さいごに
TerraformでApp Runnerを構築する際に遭遇したエラーとそれに対する対処法をまとめてみました。
誰かの参考になれば幸いです。